<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: cfg/option_set.hpp File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Public API.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_cfb2ffb2869bbb27b7281952022eb856.html">cfg</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#namespaces">Namespaces</a> &#124;
<a href="#define-members">Macros</a> &#124;
<a href="#func-members">Functions</a>  </div>
  <div class="headertitle"><div class="title">option_set.hpp File Reference</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1cfg_1_1Option__set__base.html">flow::cfg::Option_set_base</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Un-templated base for <a class="el" href="classflow_1_1cfg_1_1Option__set.html" title="The core config-parsing facility, which builds parsing/comparison/output capabilities on top of a giv...">Option_set</a>.  <a href="classflow_1_1cfg_1_1Option__set__base.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1cfg_1_1Option__set.html">flow::cfg::Option_set&lt; Value_set &gt;</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">The core config-parsing facility, which builds parsing/comparison/output capabilities on top of a given simple config-holding object, of the type <code>Value_set</code>, a template argument to this class template.  <a href="classflow_1_1cfg_1_1Option__set.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structflow_1_1cfg_1_1Option__set_1_1Declare__options__func__args.html">flow::cfg::Option_set&lt; Value_set &gt;::Declare_options_func_args</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal-use structure to use with <a class="el" href="classflow_1_1cfg_1_1Option__set.html#ac6755bc762fc40b1ae8f4bd47c55bd39" title="Short-hand for the ever-important callback passed to the main Option_set constructor.">Declare_options_func</a> callback.  <a href="structflow_1_1cfg_1_1Option__set_1_1Declare__options__func__args.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
Namespaces</h2></td></tr>
<tr class="memitem:namespaceflow"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceflow.html">flow</a></td></tr>
<tr class="memdesc:namespaceflow"><td class="mdescLeft">&#160;</td><td class="mdescRight">Catch-all namespace for the Flow project: A collection of various production-quality modules written in modern C++17, originally by ygoldfel. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:namespaceflow_1_1cfg"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1cfg.html">flow::cfg</a></td></tr>
<tr class="memdesc:namespaceflow_1_1cfg"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flow module that facilitates configuring modules, such as applications and APIs, via statically and/or dynamically parsed sets of name/value pairs from config sources like files and command lines. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:ae6bc0bcf28a53682a4c9a5fbe3a3837f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f">FLOW_CFG_OPTION_SET_DECLARE_OPTION</a>(ARG_m_value,  ARG_description,  ARG_bool_validate_expr)&#160;&#160;&#160;  <a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS</a>(ARG_m_value, ARG_description, ARG_bool_validate_expr, false)</td></tr>
<tr class="memdesc:ae6bc0bcf28a53682a4c9a5fbe3a3837f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Macro the user must use, as prescribed in the <a class="el" href="classflow_1_1cfg_1_1Option__set.html" title="The core config-parsing facility, which builds parsing/comparison/output capabilities on top of a giv...">flow::cfg::Option_set</a> constructor doc header discussing <code>declare_opts_func</code> in their <a class="el" href="classflow_1_1cfg_1_1Option__set.html#ac6755bc762fc40b1ae8f4bd47c55bd39" title="Short-hand for the ever-important callback passed to the main Option_set constructor.">flow::cfg::Option_set::Declare_options_func</a> callback, when declaring each individual config option as linked to a given data member of their config-bearing <code>struct</code> used as the <code>Value_set</code> in <code>Option_set&lt;Value_set&gt;</code>.  <a href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f">More...</a><br /></td></tr>
<tr class="separator:ae6bc0bcf28a53682a4c9a5fbe3a3837f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9187f169f3eaf596c0e7b0f9e7e34761"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="option__set_8hpp.html#a9187f169f3eaf596c0e7b0f9e7e34761">FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC</a>(ARG_m_value,  ARG_description,  ARG_bool_validate_expr)&#160;&#160;&#160;  <a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS</a>(ARG_m_value, ARG_description, ARG_bool_validate_expr, true)</td></tr>
<tr class="memdesc:a9187f169f3eaf596c0e7b0f9e7e34761"><td class="mdescLeft">&#160;</td><td class="mdescRight">Identical to <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>, except the option is marked as <em>non-accumulating</em>, which means that each time a config source (such as file) is parsed, this option's value is reset to default and then only overwritten with a potential non-default value if explicitly specified in the config source.  <a href="option__set_8hpp.html#a9187f169f3eaf596c0e7b0f9e7e34761">More...</a><br /></td></tr>
<tr class="separator:a9187f169f3eaf596c0e7b0f9e7e34761"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4fef7c1a28ef3510f71fae708c647590"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED</a>(ARG_m_value,  ARG_description,  ARG_bool_validate_expr,  ARG_key)</td></tr>
<tr class="memdesc:a4fef7c1a28ef3510f71fae708c647590"><td class="mdescLeft">&#160;</td><td class="mdescRight">Identical to <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>, but with support for setting a value at a container subscript.  <a href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590">More...</a><br /></td></tr>
<tr class="separator:a4fef7c1a28ef3510f71fae708c647590"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acebdea54dd008e15d8e3b36a1c3fbb67"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="option__set_8hpp.html#acebdea54dd008e15d8e3b36a1c3fbb67">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED_NO_ACC</a>(ARG_m_value,  ARG_description,  ARG_bool_validate_expr,  ARG_key)</td></tr>
<tr class="memdesc:acebdea54dd008e15d8e3b36a1c3fbb67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Identical to <a class="el" href="option__set_8hpp.html#acebdea54dd008e15d8e3b36a1c3fbb67" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED_NO_ACC(), except the option is marked as non-ac...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED_NO_ACC()</a>, except the option is marked as <em>non-accumulating</em> in the same sense as for <a class="el" href="option__set_8hpp.html#a9187f169f3eaf596c0e7b0f9e7e34761" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), except the option is marked as non-accumulating,...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC()</a>.  <a href="option__set_8hpp.html#acebdea54dd008e15d8e3b36a1c3fbb67">More...</a><br /></td></tr>
<tr class="separator:acebdea54dd008e15d8e3b36a1c3fbb67"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab4bbc1d89a4476cdce0d29fd7dc461e8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS</a>(ARG_m_value,  ARG_description,  ARG_bool_validate_expr,  ARG_no_accumulation)</td></tr>
<tr class="memdesc:ab4bbc1d89a4476cdce0d29fd7dc461e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">As of this writing is identical to either <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a> or <a class="el" href="option__set_8hpp.html#a9187f169f3eaf596c0e7b0f9e7e34761" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), except the option is marked as non-accumulating,...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC()</a>, depending on the value of <code>ARG_no_accumulation</code> argument.  <a href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8">More...</a><br /></td></tr>
<tr class="separator:ab4bbc1d89a4476cdce0d29fd7dc461e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab96b1325e31736438412e5125ae4fb26"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="option__set_8hpp.html#ab96b1325e31736438412e5125ae4fb26">FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED</a>(ARG_m_value,  ARG_opt_name_c_str,  ARG_description,  ARG_bool_validate_expr,  ARG_no_accumulation)</td></tr>
<tr class="memdesc:ab96b1325e31736438412e5125ae4fb26"><td class="mdescLeft">&#160;</td><td class="mdescRight">Identical to <a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8" title="As of this writing is identical to either FLOW_CFG_OPTION_SET_DECLARE_OPTION() or FLOW_CFG_OPTION_SET...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS()</a>, except the user must specify the option's string name manually as an argument to the functional macro.  <a href="option__set_8hpp.html#ab96b1325e31736438412e5125ae4fb26">More...</a><br /></td></tr>
<tr class="separator:ab96b1325e31736438412e5125ae4fb26"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:af310e567f2763a9736eda686030e6311"><td class="memTemplParams" colspan="2">template&lt;typename Value_set &gt; </td></tr>
<tr class="memitem:af310e567f2763a9736eda686030e6311"><td class="memTemplItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1cfg.html#af310e567f2763a9736eda686030e6311">flow::cfg::operator&lt;&lt;</a> (std::ostream &amp;os, const Option_set&lt; Value_set &gt; &amp;val)</td></tr>
<tr class="memdesc:af310e567f2763a9736eda686030e6311"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes (briefly) an <a class="el" href="classflow_1_1cfg_1_1Option__set.html" title="The core config-parsing facility, which builds parsing/comparison/output capabilities on top of a giv...">Option_set</a> to a standard output stream.  <a href="namespaceflow_1_1cfg.html#af310e567f2763a9736eda686030e6311">More...</a><br /></td></tr>
<tr class="separator:af310e567f2763a9736eda686030e6311"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1f5ff766e52aae24e6d5c876b3b26e96"><td class="memTemplParams" colspan="2">template&lt;typename Value &gt; </td></tr>
<tr class="memitem:a1f5ff766e52aae24e6d5c876b3b26e96"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1cfg.html#a1f5ff766e52aae24e6d5c876b3b26e96">flow::cfg::value_to_ostream</a> (std::ostream &amp;os, const Value &amp;val)</td></tr>
<tr class="memdesc:a1f5ff766e52aae24e6d5c876b3b26e96"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serializes a value of type <code>Value</code> to the given <code>ostream</code> suitably for output in Option_set-related output to user such as in help messages.  <a href="namespaceflow_1_1cfg.html#a1f5ff766e52aae24e6d5c876b3b26e96">More...</a><br /></td></tr>
<tr class="separator:a1f5ff766e52aae24e6d5c876b3b26e96"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac3782f31b7c020d7b08e250e89198ad4"><td class="memTemplParams" colspan="2">template&lt;typename Rep , typename Period &gt; </td></tr>
<tr class="memitem:ac3782f31b7c020d7b08e250e89198ad4"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1cfg.html#ac3782f31b7c020d7b08e250e89198ad4">flow::cfg::value_to_ostream</a> (std::ostream &amp;os, const boost::chrono::duration&lt; Rep, Period &gt; &amp;val)</td></tr>
<tr class="memdesc:ac3782f31b7c020d7b08e250e89198ad4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Overload that serializes a value of <code>chrono</code>-based <code>duration</code> including <code>Fine_duration</code> &ndash; which is recommended to use for Option_set-configured time durations &ndash; to the given <code>ostream</code> suitably for output in Option_set-related output to user such as in help messages.  <a href="namespaceflow_1_1cfg.html#ac3782f31b7c020d7b08e250e89198ad4">More...</a><br /></td></tr>
<tr class="separator:ac3782f31b7c020d7b08e250e89198ad4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a66d8d4f33601a06cb7bc109b22800387"><td class="memTemplParams" colspan="2">template&lt;typename Element &gt; </td></tr>
<tr class="memitem:a66d8d4f33601a06cb7bc109b22800387"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1cfg.html#a66d8d4f33601a06cb7bc109b22800387">flow::cfg::value_to_ostream</a> (std::ostream &amp;os, const std::vector&lt; Element &gt; &amp;val)</td></tr>
<tr class="memdesc:a66d8d4f33601a06cb7bc109b22800387"><td class="mdescLeft">&#160;</td><td class="mdescRight">Overload that serializes a list value (with <code>Element</code> type itself similarly serializable) to the given <code>ostream</code> suitably for output in Option_set-related output to user such as in help messages.  <a href="namespaceflow_1_1cfg.html#a66d8d4f33601a06cb7bc109b22800387">More...</a><br /></td></tr>
<tr class="separator:a66d8d4f33601a06cb7bc109b22800387"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aafaf432a612183beab72175831aaa960"><td class="memTemplParams" colspan="2">template&lt;typename Key &gt; </td></tr>
<tr class="memitem:aafaf432a612183beab72175831aaa960"><td class="memTemplItemLeft" align="right" valign="top">std::string&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespaceflow_1_1cfg.html#aafaf432a612183beab72175831aaa960">flow::cfg::value_set_member_id_to_opt_name_keyed</a> (util::String_view member_id, const Key &amp;key)</td></tr>
<tr class="memdesc:aafaf432a612183beab72175831aaa960"><td class="mdescLeft">&#160;</td><td class="mdescRight">Similar to <a class="el" href="namespaceflow_1_1cfg.html#a696eee859b6e3f0fc0b6473a1d2836b0" title="Utility, used by FLOW_CFG_OPTION_SET_DECLARE_OPTION() internally but made available as a public API i...">value_set_member_id_to_opt_name()</a> but used by <a class="el" href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), but with support for setting a value at a containe...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED()</a> internally (also made available as a public API in case it is useful), that does the job of <a class="el" href="namespaceflow_1_1cfg.html#a696eee859b6e3f0fc0b6473a1d2836b0" title="Utility, used by FLOW_CFG_OPTION_SET_DECLARE_OPTION() internally but made available as a public API i...">value_set_member_id_to_opt_name()</a> in addition to substituting the last <code>[...]</code> fragment with a dot separator, followed by the <code>ostream</code> encoding of <code>key</code>.  <a href="namespaceflow_1_1cfg.html#aafaf432a612183beab72175831aaa960">More...</a><br /></td></tr>
<tr class="separator:aafaf432a612183beab72175831aaa960"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h2 class="groupheader">Macro Definition Documentation</h2>
<a id="ae6bc0bcf28a53682a4c9a5fbe3a3837f" name="ae6bc0bcf28a53682a4c9a5fbe3a3837f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae6bc0bcf28a53682a4c9a5fbe3a3837f">&#9670;&nbsp;</a></span>FLOW_CFG_OPTION_SET_DECLARE_OPTION</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_CFG_OPTION_SET_DECLARE_OPTION</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_m_value, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_description, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_bool_validate_expr&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td>&#160;&#160;&#160;  <a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS</a>(ARG_m_value, ARG_description, ARG_bool_validate_expr, false)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Macro the user must use, as prescribed in the <a class="el" href="classflow_1_1cfg_1_1Option__set.html" title="The core config-parsing facility, which builds parsing/comparison/output capabilities on top of a giv...">flow::cfg::Option_set</a> constructor doc header discussing <code>declare_opts_func</code> in their <a class="el" href="classflow_1_1cfg_1_1Option__set.html#ac6755bc762fc40b1ae8f4bd47c55bd39" title="Short-hand for the ever-important callback passed to the main Option_set constructor.">flow::cfg::Option_set::Declare_options_func</a> callback, when declaring each individual config option as linked to a given data member of their config-bearing <code>struct</code> used as the <code>Value_set</code> in <code>Option_set&lt;Value_set&gt;</code>. </p>
<dl class="section note"><dt>Note</dt><dd>The resulting option name, as found in config sources such as config files, will be auto-computed from the string <code>#ARG_m_value</code>. So if <code>ARG_m_value</code> is <code>m_cool_thing.m_cool_guy</code>, then the option name might be computed to be, say, <code>"cool-thing.cool-duration"</code>, with a config file line: <code>"cool-thing.cool-duration=2 milliseconds"</code>. </dd>
<dd>
It may be desirable to <em>not</em> auto-name a given option; a known use case for this is legacy option names, if renaming is difficult in the field. Use <a class="el" href="option__set_8hpp.html#ab96b1325e31736438412e5125ae4fb26" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS(), except the user must specify the option...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED()</a> if indeed you want to custom-name your option.</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_m_value</td><td>Supposing <code>Value_set</code> is the template arg to <code>Option_set</code>, and <code>Value_set V</code> is being registered, then <code>ARG_m_value</code> is such that <code>V.ARG_m_value</code> is the scalar into which the particular config option shall be deserialized. It shall be a scalar data member name, optionally within a compound data member, which is itself optionally within a compound, and so forth, within <code>Value_set V</code>. Each optional compounding may be via simple object composition (<code>.</code>) or pointer dereference (<code>-&gt;</code>). Examples: <code>m_direct_member</code>, <code>m_group_obj.m_indirect_member</code>, <code>m_group.m_group1-&gt;m_pointed_group-&gt;m_cool_scalar</code>. Reminder: each of these must be accessible within a <code>Value_set</code> via <code>.</code> compounding. E.g.: <code>V.m_direct_member</code> a/k/a <code>Value_set::m_direct_member</code>. </td></tr>
    <tr><td class="paramname">ARG_description</td><td>Description of the option as shown to the user in help text. Use 1+ sentence(s), starting with capital and ending with punctuator. Indicate all key semantics, including special values, but (1) try to keep to one sentence and line if possible; and (2) save extended discussion for the comment on the data member declaration itself. Omit discussion of defaults; the default will be auto-printed and might change in code later. Reminder: This is a brief summary &ndash; not a <code>man</code> page equivalent... but a <code>man</code> page equivalent <em>should</em> be in the actual code. </td></tr>
    <tr><td class="paramname">ARG_bool_validate_expr</td><td>In a fashion similar to <code>assert()</code> arg, an expression convertible to <code>bool</code> such that if and only if it evaluates to <code>false</code> at the time of parsing a value for <code>ARG_m_value</code> from a config source, then the value is considered invalid, causing parse failure for that config source. The expression shall assume that the parsed value is in the variable of type <code>Value</code> named <code>val</code>. (If no further validation is needed, you may simply pass in <code>true</code>.) </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="a4fef7c1a28ef3510f71fae708c647590" name="a4fef7c1a28ef3510f71fae708c647590"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4fef7c1a28ef3510f71fae708c647590">&#9670;&nbsp;</a></span>FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_m_value, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_description, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_bool_validate_expr, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_key&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line">  <a class="code hl_define" href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a> \</div>
<div class="line">    ( \</div>
<div class="line">      const ::std::string FLOW_CFG_SET_DECL_OPT_KEYED_name \</div>
<div class="line">        = <a class="code hl_function" href="namespaceflow_1_1cfg.html#aafaf432a612183beab72175831aaa960">::flow::cfg::value_set_member_id_to_opt_name_keyed</a>(#ARG_m_value, ARG_key); \</div>
<div class="line">      FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED \</div>
<div class="line">        (ARG_m_value, FLOW_CFG_SET_DECL_OPT_KEYED_name.c_str(), ARG_description, ARG_bool_validate_expr, <span class="keyword">false</span>); \</div>
<div class="line">    )</div>
<div class="ttc" id="anamespaceflow_1_1cfg_html_aafaf432a612183beab72175831aaa960"><div class="ttname"><a href="namespaceflow_1_1cfg.html#aafaf432a612183beab72175831aaa960">flow::cfg::value_set_member_id_to_opt_name_keyed</a></div><div class="ttdeci">std::string value_set_member_id_to_opt_name_keyed(util::String_view member_id, const Key &amp;key)</div><div class="ttdoc">Similar to value_set_member_id_to_opt_name() but used by FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED() i...</div><div class="ttdef"><b>Definition:</b> option_set.hpp:2237</div></div>
<div class="ttc" id="autil__fwd_8hpp_html_a402a1fb61d3fe4ca6767729e38620d6d"><div class="ttname"><a href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a></div><div class="ttdeci">#define FLOW_UTIL_SEMICOLON_SAFE(ARG_func_macro_definition)</div><div class="ttdoc">Use this to create a semicolon-safe version of a &quot;void&quot; functional macro definition consisting of at ...</div><div class="ttdef"><b>Definition:</b> util_fwd.hpp:1079</div></div>
</div><!-- fragment -->
<p>Identical to <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>, but with support for setting a value at a container subscript. </p>
<p >It works as follows. Normally <code>ARG_m_value</code>, when stringified via <code>#</code> preprocessor trick, looks like a sequence of <code>m_...</code> of identifiers joined with <code>.</code> and/or <code>-&gt;</code>. Call these <em>terms</em>. In this case, however, exactly one of the terms &ndash; but not the trailing term &ndash; must end with the postfix <code>[...]</code>, where <code>...</code> may be 1 or more characters excluding <code>]</code>. As in <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>, the option name will be auto-computed based on the stringification; but with one extra step at the end: <code>[...]</code> shall be replaced by the added macro arg <code>ARG_key</code>, which must be <code>ostream&lt;&lt;</code>able.</p>
<p >This can be used to fill out fixed-key-set containers of <code>struct</code>s concisely. Otherwise one would have to tediously unroll the loop and manually provide the name via <a class="el" href="option__set_8hpp.html#ab96b1325e31736438412e5125ae4fb26" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS(), except the user must specify the option...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED()</a>. Perhaps best shown by example:</p>
<div class="fragment"><div class="line"><span class="comment">// In Value_set:</span></div>
<div class="line">  <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> S_N_GRAND_PARENTS = 4;</div>
<div class="line">  <span class="keyword">struct </span>Grand_parent { <span class="keywordtype">string</span> m_name; <span class="keywordtype">bool</span> m_male_else_female = <span class="keyword">false</span>; };</div>
<div class="line">  array&lt;Grand_parent, S_N_GRAND_PARENTS&gt; m_grand_parents;</div>
<div class="line"><span class="comment">// When declaring options for Option_set&lt;Value_set&gt;:</span></div>
<div class="line">  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> idx = 0; idx != Value_set::S_N_GRAND_PARENTS; ++idx)</div>
<div class="line">  {</div>
<div class="line">    <a class="code hl_define" href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED</a>(m_grand_parents[idx].m_name, <span class="stringliteral">&quot;The grandparent&#39;s name.&quot;</span>, <span class="keyword">true</span>, idx);</div>
<div class="line">    <a class="code hl_define" href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED</a>(m_grand_parents[idx].m_male_else_female, <span class="stringliteral">&quot;Their gender.&quot;</span>, <span class="keyword">true</span>, idx);</div>
<div class="line">  }</div>
<div class="line"><span class="comment">// Resulting config options:</span></div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.0.name&quot;</span></div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.0.male-else-female&quot;</span></div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.1.name&quot;</span></div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.1.male-else-female&quot;</span></div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.2.name&quot;</span></div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.2.male-else-female&quot;</span></div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.3.name&quot;</span></div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.3.male-else-female&quot;</span></div>
<div class="line"><span class="comment">// Example file:</span></div>
<div class="line">  [grand-parents.0]</div>
<div class="line">  name=Alice Eve</div>
<div class="line">  male-<span class="keywordflow">else</span>-female=<span class="keyword">false</span></div>
<div class="line">  [grand-parents.1]</div>
<div class="line">  name=Ray Liotta</div>
<div class="line">  male-<span class="keywordflow">else</span>-female=<span class="keyword">true</span></div>
<div class="line">  ...</div>
<div class="ttc" id="aoption__set_8hpp_html_a4fef7c1a28ef3510f71fae708c647590"><div class="ttname"><a href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED</a></div><div class="ttdeci">#define FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED(ARG_m_value, ARG_description, ARG_bool_validate_expr, ARG_key)</div><div class="ttdoc">Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), but with support for setting a value at a containe...</div><div class="ttdef"><b>Definition:</b> option_set.hpp:1277</div></div>
</div><!-- fragment --><p >Tip: In this example <code>idx</code> is a number; and the container is an <code>array</code>. However, it can be any container with both keys and values; it just needs to always have the same key set after <code>Value_set</code> construction: <code>map</code>, <code>vector</code>, etc. Accordingly the key can be anything <code>ostream&lt;&lt;</code>-able (e.g., <code>string</code> works). However &ndash; behavior is undefined if the value, when <code>ostream&lt;&lt;</code>ed, would not be accepted by boost.program_options as an option name postfix. Informally: keep it to alphanumerics and underscores.</p>
<dl class="section note"><dt>Note</dt><dd>Do not confuse this with the situation where <em>one</em> option is <em>itself</em> a <code>vector&lt;T&gt;</code>, where <code>T</code> is a scalar (from boost.program_options' point of view). E.g., a <code>vector&lt;int&gt;</code> can simply be a single option, and the user can supply as many or as few elements as they want, at runtime (in config file, one option per line). For example the above <code>Value_set</code> can <em>itself</em> contain a <code>vector&lt;&gt;</code> in <em>each</em> <code>struct</code> in the array:</dd></dl>
<div class="fragment"><div class="line"><span class="comment">// In Value_set:</span></div>
<div class="line">  <span class="keyword">struct </span>Grand_parent { ...; vector&lt;int&gt; m_kid_ages; };</div>
<div class="line"><span class="comment">// When declaring options for Option_set&lt;Value_set&gt;:</span></div>
<div class="line">  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> idx = 0; idx != Value_set::S_N_GRAND_PARENTS; ++idx)</div>
<div class="line">  {</div>
<div class="line">    ...</div>
<div class="line">    <a class="code hl_define" href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED</a>(m_grand_parents[idx].m_kid_ages, <span class="stringliteral">&quot;Children&#39;s age list.&quot;</span>, <span class="keyword">true</span>, idx);</div>
<div class="line">  }</div>
<div class="line"><span class="comment">// Resulting config options:</span></div>
<div class="line">  ...</div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.0.kid-ages&quot;</span></div>
<div class="line">  ...</div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.1.kid-ages&quot;</span></div>
<div class="line">  ...</div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.2.kid-ages&quot;</span></div>
<div class="line">  ...</div>
<div class="line">  <span class="stringliteral">&quot;grand-parents.3.kid-ages&quot;</span></div>
<div class="line"><span class="comment">// Example file:</span></div>
<div class="line">  [grand-parents.0]</div>
<div class="line">  name=Alice Eve</div>
<div class="line">  male-<span class="keywordflow">else</span>-female=<span class="keyword">false</span></div>
<div class="line">  kid-ages=5</div>
<div class="line">  kid-ages=7</div>
<div class="line">  kid-ages=25</div>
<div class="line">  [grand-parents.1]</div>
<div class="line">  name=Ray Liotta</div>
<div class="line">  male-<span class="keywordflow">else</span>-female=<span class="keyword">true</span></div>
<div class="line">  kid-ages=32</div>
<div class="line">  ...</div>
</div><!-- fragment --><dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_m_value</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_description</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_bool_validate_expr</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_key</td><td>See above. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="acebdea54dd008e15d8e3b36a1c3fbb67" name="acebdea54dd008e15d8e3b36a1c3fbb67"></a>
<h2 class="memtitle"><span class="permalink"><a href="#acebdea54dd008e15d8e3b36a1c3fbb67">&#9670;&nbsp;</a></span>FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED_NO_ACC</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED_NO_ACC</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_m_value, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_description, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_bool_validate_expr, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_key&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line">  <a class="code hl_define" href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a> \</div>
<div class="line">    ( \</div>
<div class="line">      const ::std::string FLOW_CFG_SET_DECL_OPT_KEYED_name \</div>
<div class="line">        = <a class="code hl_function" href="namespaceflow_1_1cfg.html#aafaf432a612183beab72175831aaa960">::flow::cfg::value_set_member_id_to_opt_name_keyed</a>(#ARG_m_value, ARG_key); \</div>
<div class="line">      FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED \</div>
<div class="line">        (ARG_m_value, FLOW_CFG_SET_DECL_OPT_KEYED_name.c_str(), ARG_description, ARG_bool_validate_expr, <span class="keyword">true</span>); \</div>
<div class="line">    )</div>
</div><!-- fragment -->
<p>Identical to <a class="el" href="option__set_8hpp.html#acebdea54dd008e15d8e3b36a1c3fbb67" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED_NO_ACC(), except the option is marked as non-ac...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED_NO_ACC()</a>, except the option is marked as <em>non-accumulating</em> in the same sense as for <a class="el" href="option__set_8hpp.html#a9187f169f3eaf596c0e7b0f9e7e34761" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), except the option is marked as non-accumulating,...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC()</a>. </p>
<dl class="section see"><dt>See also</dt><dd><a class="el" href="option__set_8hpp.html#a9187f169f3eaf596c0e7b0f9e7e34761" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), except the option is marked as non-accumulating,...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC()</a> for a brief explanation of how non-accumulating options work.</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_m_value</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_description</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_bool_validate_expr</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_key</td><td>See <a class="el" href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), but with support for setting a value at a containe...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED()</a>. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="ab96b1325e31736438412e5125ae4fb26" name="ab96b1325e31736438412e5125ae4fb26"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab96b1325e31736438412e5125ae4fb26">&#9670;&nbsp;</a></span>FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_m_value, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_opt_name_c_str, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_description, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_bool_validate_expr, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_no_accumulation&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Identical to <a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8" title="As of this writing is identical to either FLOW_CFG_OPTION_SET_DECLARE_OPTION() or FLOW_CFG_OPTION_SET...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS()</a>, except the user must specify the option's string name manually as an argument to the functional macro. </p>
<p >(<a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8" title="As of this writing is identical to either FLOW_CFG_OPTION_SET_DECLARE_OPTION() or FLOW_CFG_OPTION_SET...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS()</a> itself is basically <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a> plus certain knobs which the former sets to commonly-used values for concision.)</p>
<p >This macro, which can be used directly but normally is not, is internally invoked (potentially indirectly) by any other <code>FLOW_CFG_OPTION_SET_DECLARE_OPTION*()</code> macro. As such it is the essential core such macro.</p>
<p >Informally: it is best to avoid its direct use, as it can break the auto-naming conventions maintained by <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a> and similar. That said a couple of use cases might be:</p><ul>
<li><a class="el" href="option__set_8hpp.html#a4fef7c1a28ef3510f71fae708c647590" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), but with support for setting a value at a containe...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_KEYED()</a> uses it in its impl to add a convention for container subscripts.</li>
<li>One can specify a legacy option-name alias. (E.g., one can <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a> an option and then <a class="el" href="option__set_8hpp.html#ab96b1325e31736438412e5125ae4fb26" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS(), except the user must specify the option...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED()</a> a manually-named option targeting the same <code>Value_set</code> member. Then either the auto-generated name or the legacy name can be used in a config source, until the latter is deprecated-out successfully in the field.)</li>
</ul>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_opt_name_c_str</td><td>The option's manually specified string name. Type: directly convertible to <code>const char*</code>; typically a string literal. </td></tr>
    <tr><td class="paramname">ARG_m_value</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_description</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_bool_validate_expr</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_no_accumulation</td><td>See <a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8" title="As of this writing is identical to either FLOW_CFG_OPTION_SET_DECLARE_OPTION() or FLOW_CFG_OPTION_SET...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS()</a>. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="a9187f169f3eaf596c0e7b0f9e7e34761" name="a9187f169f3eaf596c0e7b0f9e7e34761"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9187f169f3eaf596c0e7b0f9e7e34761">&#9670;&nbsp;</a></span>FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_m_value, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_description, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_bool_validate_expr&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td>&#160;&#160;&#160;  <a class="el" href="option__set_8hpp.html#ab4bbc1d89a4476cdce0d29fd7dc461e8">FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS</a>(ARG_m_value, ARG_description, ARG_bool_validate_expr, true)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Identical to <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>, except the option is marked as <em>non-accumulating</em>, which means that each time a config source (such as file) is parsed, this option's value is reset to default and then only overwritten with a potential non-default value if explicitly specified in the config source. </p>
<p >(Otherwise the option is accumulating, hence whatever value is already stored in the <code>Value_set</code> is left unchanged unless specified in the config source.)</p>
<dl class="section note"><dt>Note</dt><dd>This may be useful, in particular, when used in <a class="el" href="classflow_1_1cfg_1_1Config__manager.html" title="Manages a config setup, intended for a single daemon process, by maintaining 1 or more set(s) of stat...">flow::cfg::Config_manager</a> in multi-file updates for special options that implement conditionality. It does not make sense to accumulate such options' values from file to file in a given update, so this <code>_NO_ACC</code> variant macro makes sense to use.</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_m_value</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_description</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_bool_validate_expr</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="ab4bbc1d89a4476cdce0d29fd7dc461e8" name="ab4bbc1d89a4476cdce0d29fd7dc461e8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab4bbc1d89a4476cdce0d29fd7dc461e8">&#9670;&nbsp;</a></span>FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define FLOW_CFG_OPTION_SET_DECLARE_OPTION_WITH_KNOBS</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_m_value, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_description, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_bool_validate_expr, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">ARG_no_accumulation&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line">  <a class="code hl_define" href="util__fwd_8hpp.html#a402a1fb61d3fe4ca6767729e38620d6d">FLOW_UTIL_SEMICOLON_SAFE</a> \</div>
<div class="line">    ( \</div>
<div class="line">      const ::std::string FLOW_CFG_SET_DECL_OPT_name = <a class="code hl_function" href="namespaceflow_1_1cfg.html#a696eee859b6e3f0fc0b6473a1d2836b0">::flow::cfg::value_set_member_id_to_opt_name</a>(#ARG_m_value); \</div>
<div class="line">      FLOW_CFG_OPTION_SET_DECLARE_OPTION_MANUALLY_NAMED \</div>
<div class="line">        (ARG_m_value, FLOW_CFG_SET_DECL_OPT_name.c_str(), ARG_description, ARG_bool_validate_expr, \</div>
<div class="line">         ARG_no_accumulation); \</div>
<div class="line">    )</div>
<div class="ttc" id="anamespaceflow_1_1cfg_html_a696eee859b6e3f0fc0b6473a1d2836b0"><div class="ttname"><a href="namespaceflow_1_1cfg.html#a696eee859b6e3f0fc0b6473a1d2836b0">flow::cfg::value_set_member_id_to_opt_name</a></div><div class="ttdeci">std::string value_set_member_id_to_opt_name(util::String_view member_id)</div><div class="ttdoc">Utility, used by FLOW_CFG_OPTION_SET_DECLARE_OPTION() internally but made available as a public API i...</div><div class="ttdef"><b>Definition:</b> option_set.cpp:38</div></div>
</div><!-- fragment -->
<p>As of this writing is identical to either <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a> or <a class="el" href="option__set_8hpp.html#a9187f169f3eaf596c0e7b0f9e7e34761" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), except the option is marked as non-accumulating,...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC()</a>, depending on the value of <code>ARG_no_accumulation</code> argument. </p>
<p >Rationale: Currently we don't necessarily expect this to be widely used directly in place of the aforementioned two macros, but it seems reasonable to have a single macro with all various knobs given as parameters with certain knob combinations potentially invoked via macro(s) based on this one. As of this writing there is just the one extra knob, <code>ARG_no_accumulation</code>, but in the future we might expand to more variations in which case more args would be added here.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">ARG_m_value</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_description</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_bool_validate_expr</td><td>See <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a>. </td></tr>
    <tr><td class="paramname">ARG_no_accumulation</td><td><code>bool</code> such that <code>false</code> causes <a class="el" href="option__set_8hpp.html#ae6bc0bcf28a53682a4c9a5fbe3a3837f" title="Macro the user must use, as prescribed in the flow::cfg::Option_set constructor doc header discussing...">FLOW_CFG_OPTION_SET_DECLARE_OPTION()</a> behavior, while <code>true</code> causes <a class="el" href="option__set_8hpp.html#a9187f169f3eaf596c0e7b0f9e7e34761" title="Identical to FLOW_CFG_OPTION_SET_DECLARE_OPTION(), except the option is marked as non-accumulating,...">FLOW_CFG_OPTION_SET_DECLARE_OPTION_NO_ACC()</a> behavior. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:32 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
